// Symbol 数据类型  

//在扩展第三方库的时候，可能存在命名的键名称与第三方库命名的名称存在同名  

// shared.js =====================

// const cache = {}

// a.js ===========================
// cache['foo'] = Math.random()

// b.js ============================
// cache['foo'] = 123

// console.log(cache)

// 可以使用symbol来保证值独一无二

// const s = Symbol()
// console.log(typeof s)

// 每个Symbol都是唯一的
// console.log(
//     Symbol() === Symbol()
// )

// Symbol函数可接收一个字符串作为参数，表示对Symbol实例的描述，主要是为了在控制台显示或转化为字符串时比较容易区分
// console.log(Symbol('aaa'))
// console.log(Symbol('aaa1'))
// console.log(Symbol('aaa2'))  


// Symbol可以作为对象的键名
// const obj = {
//     [Symbol('1')]: 1
// }
// obj[Symbol('2')] = 2
// console.log(obj)

// 模拟对象的私有成员
// a.js =============
const name = Symbol()
const person = {
    [name]: 'aa',
    say(){
        console.log(this[name])
    }
}
// 外部文件无法直接调用对象内的私有成员
// 只能通过共有成员
// b.js =============
// person[Symbol()]
person.say()